package main

import (
	"bufio"
	"fmt"
	"gitee.com/jnshao/go-start/projects/pipelinedemo/pipeline"
	"os"
)

func main() {
	//MergeDemo()
	const filename = "large.in"
	const n = 100000000
	file, err := os.Create(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	c := pipeline.RandomSource(n)
	//pipeline.WriteSink(file, c) //大数据，频繁调用IO性能很慢
	w := bufio.NewWriter(file)
	pipeline.WriteSink(w, c) //使用buffer，先存入到缓存，性能高
	w.Flush()                //确保将缓存数据全部写入硬盘文件中

	file, err = os.Open(filename)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	count := 0
	//c = pipeline.ReadSource(file) //大数据，频繁调用IO性能很慢
	c = pipeline.ReadSource(bufio.NewReader(file), -1)
	for v := range c {
		fmt.Println(v)
		count++
		if count > 100 {
			break
		}
	}

	// file, err := os.Create("small.in")
	// if err != nil {
	// 	panic(err)
	// }
	// defer file.Close()

	// c := pipeline.RandomSource(64)
	// pipeline.WriteSink(file, c)

	// file, err = os.Open("small.in")
	// if err != nil {
	// 	panic(err)
	// }
	// defer file.Close()

	// c = pipeline.ReadSource(file, -1)
	// for v := range c {
	// 	fmt.Println(v)
	// }

}

func MergeDemo() {
	p := pipeline.Merge(pipeline.InMemSort(
		pipeline.ArraySource(
			3, 2, 6, 7, 4)),
		pipeline.InMemSort(
			pipeline.ArraySource(
				3, 5, 2, 7, 5))) //该代码运行不花时间

	//channel close ：1.channel标志位置1，2.唤醒所有所有等待读/写的协程，写会报错，读zero值

	//channel close关闭后还是能拿数据，只不过是channel默认值，不会阻塞
	//不关闭无值会阻塞（无缓存时），接收方/发送方两协程会阻塞等待，直到被消费

	//ok判断channel是否close
	// for {
	// 	if v, ok := <-p; ok {
	// 		fmt.Println(v)
	// 	} else { //channel close，数据接收完毕，退出循环，停止拿数据
	// 		break
	// 	}
	// }

	//用channnel实现同步等待
	for v := range p { //简单的写法：close后会退出遍历
		fmt.Println(v)
	}
}
